package br.com.Orange.controller;

import java.util.ArrayList;
import java.util.Collection;

import br.com.Orange.controller.exception.ConsumoInexistenteException;
import br.com.Orange.controller.exception.PermanenciaInexistenteException;
import br.com.Orange.controller.exception.PermanenciaJaFechadaException;
import br.com.Orange.dao.permanencia.RepositorioPermanencia;
import br.com.Orange.model.Cliente;
import br.com.Orange.model.Funcionario;
import br.com.Orange.model.Permanencia;
import br.com.Orange.model.Produto;
import br.com.Orange.model.Quarto;
import br.com.Orange.util.dados.exception.RepositorioVazioException;

public class CadastroPermanencia {
	
	private RepositorioPermanencia permanencias;
	
	public CadastroPermanencia(RepositorioPermanencia permanencias){
		this.permanencias=permanencias;
	}
	
	public void inserir(Funcionario funcionario, Quarto quarto){
		Permanencia permanencia = new Permanencia(funcionario, quarto);
		permanencias.inserir(permanencia);
	}
	
	public Permanencia procurar(int codigo) throws PermanenciaInexistenteException{
		return permanencias.procurar(codigo);
	}
	
	public void atualizar(Permanencia permanencia) throws PermanenciaInexistenteException{
		permanencias.atualizar(permanencia);
	}
	
	public void fechar(Permanencia permanencia, Cliente cliente) 
						throws PermanenciaJaFechadaException, PermanenciaInexistenteException{
		permanencia.fechar(cliente);
		permanencias.atualizar(permanencia);
	}
	
	public void fechar(Permanencia permanencia) 
						throws PermanenciaJaFechadaException, PermanenciaInexistenteException{
		permanencia.fechar();
		permanencias.atualizar(permanencia);
	}
	
	public void adicionarConsumo(Permanencia permanencia, Produto produto, int quantidade) 
					throws PermanenciaInexistenteException, PermanenciaJaFechadaException{
		permanencia.adicionarProduto(produto, quantidade);
		permanencias.atualizar(permanencia);
	}
	
	public void removerConsumo(Permanencia permanencia, Produto produto) 
						throws ConsumoInexistenteException, PermanenciaJaFechadaException, 
						PermanenciaInexistenteException{
		permanencia.removerProduto(produto);
		permanencias.atualizar(permanencia);
	}
	
	
	
	public Collection<Permanencia> listar() throws RepositorioVazioException{
		return permanencias.listar();
	}
	
	public Collection<Permanencia> listarPermanenciasFuncionario(int matricula) throws RepositorioVazioException{
		ArrayList<Permanencia> p = new ArrayList<Permanencia>();
		for(Permanencia permanencia : permanencias.listar()){
			if (permanencia.getFuncionario().getMatricula() == matricula){
				p.add(permanencia);
			}
		}
		if (p.isEmpty()){
			throw new RepositorioVazioException();
		}
		return p;
	}
	
	public Collection<Permanencia> listarPermanenciasCliente(Cliente cliente) throws RepositorioVazioException{
		ArrayList<Permanencia> p = new ArrayList<Permanencia>();
		for(Permanencia permanencia : permanencias.listar()){
			if (permanencia.getCliente().equals(cliente)){
				p.add(permanencia);
			}
		}
		if (p.isEmpty()){
			throw new RepositorioVazioException();
		}
		return p;
	}
	
	public Collection<Permanencia> listarAbertas() throws RepositorioVazioException{
		ArrayList<Permanencia> p = new ArrayList<Permanencia>();
		for(Permanencia permanencia : permanencias.listar()){
			if (permanencia.isEmAberto()){
				p.add(permanencia);
			}
		}
		if (p.isEmpty()){
			throw new RepositorioVazioException();
		}
		return p;
		
	}
	
	
	public void listarFechadas() throws RepositorioVazioException{
		ArrayList<Permanencia> p = new ArrayList<Permanencia>();
		for(Permanencia permanencia : permanencias.listar()){
			if (!(permanencia.isEmAberto())){
				p.add(permanencia);
			}
		}
		if (p.isEmpty()){
			throw new RepositorioVazioException();
		}
	}
	
}
